@DataJpaTest এবং @MockBean এর ভূমিকা
Spring Boot Testing স্প্রিং বুট অ্যাপ্লিকেশনগুলির টেস্টিং সহজ এবং কার্যকরী করতে সহায়তা করে। @DataJpaTest এবং @MockBean দুটি গুরুত্বপূর্ণ অ্যানোটেশন যা স্প্রিং বুট জেপিএ (Spring Boot JPA)-তে টেস্টিং ব্যবহৃত হয়।
- @DataJpaTest: এটি শুধুমাত্র ডেটাবেস লেয়ারের (JPA) টেস্টিং জন্য ব্যবহৃত হয়। এটি শুধুমাত্র
@Entityক্লাস,JpaRepositoryএবং ডেটাবেস সম্পর্কিত অপারেশনগুলির টেস্টিং করে এবং স্বয়ংক্রিয়ভাবে একটি ইন-মেমরি ডেটাবেস (যেমন H2) ব্যবহার করে। - @MockBean: এটি স্প্রিং বুটের জন্য একটি অ্যানোটেশন যা স্প্রিং কনটেইনারে মক (mock) Bean তৈরি করতে ব্যবহৃত হয়। এটি সাধারণত সার্ভিস বা অন্যান্য বিহেভিয়ার যেগুলির জন্য প্রকৃত ইনস্ট্যান্সের প্রয়োজন হয় না, সেগুলির টেস্ট করার জন্য ব্যবহৃত হয়।
এই দুটি অ্যানোটেশন ব্যবহার করে, আপনি JPA রেপোজিটরির জন্য টেস্ট করতে পারেন এবং মক বিহেভিয়ার দিয়ে সার্ভিসের টেস্টিং করতে পারেন।
@DataJpaTest এর মাধ্যমে JPA Testing
@DataJpaTest অ্যানোটেশন ব্যবহার করে আপনি সহজে ডেটাবেস অপারেশন, যেমন find, save, delete, ইত্যাদি টেস্ট করতে পারেন। এটি JpaRepository ইন্টারফেসের মাধ্যমে ডেটাবেসের রিড ও রাইট অপারেশন পরীক্ষা করতে সাহায্য করে।
উদাহরণ: @DataJpaTest ব্যবহার করে টেস্টিং
ধরা যাক, আমাদের একটি User Entity ক্লাস রয়েছে এবং একটি UserRepository ইন্টারফেস তৈরি করা আছে।
Step 1: User Entity ক্লাস তৈরি করা
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Constructor, Getters, and Setters
public User(String name, String email) {
this.name = name;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Step 2: UserRepository তৈরি করা
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
Step 3: @DataJpaTest এর মাধ্যমে টেস্ট তৈরি করা
এখন আমরা @DataJpaTest অ্যানোটেশন ব্যবহার করে UserRepository টেস্ট করব। এখানে আমরা টেস্টের মাধ্যমে User Entity কে ডেটাবেসে সেভ এবং ফাইন্ড করতে যাচ্ছি।
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void testSaveAndFindByEmail() {
// Create a new User
User user = new User("John Doe", "john.doe@example.com");
// Save the user
userRepository.save(user);
// Fetch the user from the database
User foundUser = userRepository.findByEmail("john.doe@example.com");
// Verify the user details
assertNotNull(foundUser);
assertEquals("John Doe", foundUser.getName());
assertEquals("john.doe@example.com", foundUser.getEmail());
}
}
এখানে:
@DataJpaTestঅ্যানোটেশন দিয়ে স্প্রিং কন্টেইনারের মধ্যে কেবল JPA সম্পর্কিত বিহেভিয়ার টেস্ট হবে।userRepository.save(user)ব্যবহার করে ডেটাবেসেUserসেভ করা হচ্ছে।userRepository.findByEmail("john.doe@example.com")ব্যবহার করেUserখোঁজা হচ্ছে।
@MockBean এর মাধ্যমে Service Testing
@MockBean অ্যানোটেশন ব্যবহার করে আপনি সার্ভিসের মক বিহেভিয়ার তৈরি করতে পারেন। এটি সাধারণত Service Layer টেস্টিংয়ে ব্যবহৃত হয় যখন আপনি Repository বা External API-এর জন্য প্রকৃত ইনস্ট্যান্স ব্যবহার না করতে চান।
উদাহরণ: @MockBean ব্যবহার করে Service Testing
ধরা যাক, আমাদের একটি UserService ক্লাস রয়েছে, যা UserRepository ব্যবহার করে User ম্যানেজ করে। এখানে আমরা @MockBean ব্যবহার করে UserRepository মক করতে যাচ্ছি।
Step 1: UserService ক্লাস তৈরি করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
}
Step 2: UserServiceTest ক্লাস তৈরি করা
এখন আমরা @MockBean ব্যবহার করে UserService টেস্ট করব। এখানে আমরা UserRepository মক করব, যাতে ডেটাবেসের ইনপুট না দিয়ে UserService ক্লাসটি টেস্ট করা যায়।
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@Test
public void testGetUserByEmail() {
// Create a mock user
User mockUser = new User("John Doe", "john.doe@example.com");
// Mock the repository method
Mockito.when(userRepository.findByEmail("john.doe@example.com")).thenReturn(mockUser);
// Call the service method
User user = userService.getUserByEmail("john.doe@example.com");
// Verify the results
assertEquals("John Doe", user.getName());
assertEquals("john.doe@example.com", user.getEmail());
}
}
এখানে:
- @MockBean ব্যবহার করে
UserRepositoryমক করা হয়েছে, যাতে ডেটাবেসের আসল ইনপুট না দিয়ে আমরাUserServiceটেস্ট করতে পারি। Mockito.when(userRepository.findByEmail("john.doe@example.com")).thenReturn(mockUser)ব্যবহার করে আমরাUserRepositoryএরfindByEmailমেথড মক করেছি।
Conclusion
স্প্রিং বুট জেপিএ (Spring Boot JPA) ব্যবহার করে আপনি @DataJpaTest এবং @MockBean এর মাধ্যমে কার্যকরভাবে টেস্টিং করতে পারেন:
- @DataJpaTest: শুধুমাত্র JPA ডেটাবেস অপারেশন এবং রেপোজিটরি লেয়ারের টেস্টিং এর জন্য ব্যবহৃত হয়।
- @MockBean: সার্ভিস লেয়ার টেস্টিংয়ে ব্যবহৃত হয় যেখানে আপনি মক বিহেভিয়ার তৈরি করে ডিপেনডেন্সি ইনজেকশন করতে পারেন, যেমন UserRepository বা অন্যান্য এক্সটার্নাল সার্ভিসের জন্য।
এভাবে, আপনি সহজেই স্প্রিং বুট জেপিএ অ্যাপ্লিকেশনগুলির টেস্টিং করতে পারেন এবং ডেটাবেস বা বাহ্যিক ডিপেনডেন্সি ছাড়া লজিক টেস্ট করতে পারেন।
Read more